﻿using System;
using Szabalyrendszer.Modositok;

namespace Szabalyrendszer
{
    public class OpcionalisSzabalySzamolo
    {
        public OpcionalisSzabalyok Szabalyok
        {
            get { return OpcionalisSzabalyok.Instancia; }
        }

        public bool LeutesSzamolas(LeutesTalalatHelye talalatHelye, int elszenvedettFp, int celpontAkarateroErteke, int celzottPusztakezesHarcSzorzo)
        {
            int hatarertek = celpontAkarateroErteke;

            switch (talalatHelye)
            {
                case LeutesTalalatHelye.Tarko:
                case LeutesTalalatHelye.Halantek:
                case LeutesTalalatHelye.Allcsucs:
                    hatarertek += 0;
                    break;
                case LeutesTalalatHelye.Orr:
                case LeutesTalalatHelye.Torok:
                    hatarertek += 1;
                    break;
                case LeutesTalalatHelye.Szegcsont:
                case LeutesTalalatHelye.Nyakizom:
                case LeutesTalalatHelye.Fej:
                    hatarertek += 3;
                    break;
                case LeutesTalalatHelye.Honalj:
                case LeutesTalalatHelye.Vese:
                case LeutesTalalatHelye.Gyomorszaly:
                    hatarertek += 5;
                    break;
                case LeutesTalalatHelye.Lagyek:
                case LeutesTalalatHelye.Bordak:
                    hatarertek += 7;
                    break;
                case LeutesTalalatHelye.BarholMasutt:
                    hatarertek += 9;
                    break;
                default:
                    throw new ArgumentOutOfRangeException("talalatHelye");
            }

            return hatarertek < elszenvedettFp * (celzottPusztakezesHarcSzorzo == 0 ? 1 : celzottPusztakezesHarcSzorzo);
        }

        public bool LeutesSzamolas(TalalatHelye talalatHelye, int elszenvedettFp, int celpontAkarateroErteke)
        {
            int hatarertek = celpontAkarateroErteke;

            switch (talalatHelye)
            {
                case TalalatHelye.Fej:
                    hatarertek += 3;
                    break;
                case TalalatHelye.Torzs:
                    hatarertek += 7;
                    break;
                case TalalatHelye.FegyverforgatoKar:
                case TalalatHelye.NemFegyverforgatoKar:
                case TalalatHelye.BalLab:
                case TalalatHelye.JobbLab:
                    hatarertek += 9;
                    break;
                default:
                    throw new ArgumentOutOfRangeException("talalatHelye");
            }

            return hatarertek < elszenvedettFp;
        }

        public HarcertekBonusz SerulesiModositoSzamolo(KarakterLap karakter)
        {
            HarcertekBonusz modosito = new HarcertekBonusz();

            //observer
            return modosito;
        }

        public Seb EsesSzamolo(int esesiMagassag, int esesKepzettsegSzazalekba, int allokepesseg, int mgt)
        {
            return EsesSzamolo(esesiMagassag, esesKepzettsegSzazalekba, allokepesseg, mgt, 0, Kockadobo.Instancia.Dob(100) < esesKepzettsegSzazalekba);
        }

        public Seb EsesSzamolo(int esesiMagassag, int esesKepzettsegSzazalekba, int allokepesseg, int mgt, int felszerelesSulyaFontba)
        {
            return EsesSzamolo(esesiMagassag, esesKepzettsegSzazalekba, allokepesseg, mgt, felszerelesSulyaFontba, Kockadobo.Instancia.Dob(100) < esesKepzettsegSzazalekba);
        }

        public Seb EsesSzamolo(int esesiMagassag, int esesKepzettsegSzazalekba, int allokepesseg, int mgt, int felszerelesSulyaFontba, bool sikeresProba)
        {
            Seb esesSebzese = new Seb();
            int csokkentettKepzettseg = esesKepzettsegSzazalekba - felszerelesSulyaFontba;

            int sebzesCsokkenes = csokkentettKepzettseg / 5;
            sebzesCsokkenes = sikeresProba ? 2 * sebzesCsokkenes : sebzesCsokkenes;

            int sebzes = 0;

            if (Szabalyok.Zuhanas)
            {

            }
            else
            {
                if (sebzes < allokepesseg)
                {
                    esesSebzese = new Seb
                                      {
                                          Fp = sebzes,
                                          Ep = KotelezoEpSzamolas(sebzes)
                                      };
                }
                else
                {
                    esesSebzese = new Seb
                                      {
                                          Fp = allokepesseg,
                                          Ep = sebzes - allokepesseg + KotelezoEpSzamolas(allokepesseg)
                                      };
                }
            }

            return null;
        }

        public int KotelezoEpSzamolas(int fp)
        {
            return Szabalyok.KotelezoEpVesztes ? fp / 5 : 0;
        }
    }
}
